package tratamientoDatos;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.LinkedHashMap;
import java.util.Map.Entry;

import org.json.JSONException;
import org.json.JSONObject;
import org.osmdroid.util.GeoPoint;
import org.xmlpull.v1.XmlSerializer;

import comunicacionServidor.FuncionesJSON;

import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.util.Xml;

public class CreacionRutaGPX {

	private String nombre;
	private LinkedHashMap<Long, GeoPoint> camino;
	private XmlSerializer ser;
	private File f;
	private OutputStreamWriter fout;
	private DataInputStream in;
	private OutputStreamWriter out;

	private static String KEY_SUCCESS = "success";

	//Constructor para crear un fichero ruta partiendo de GeoPoints
	public CreacionRutaGPX(String nombre, LinkedHashMap<Long, GeoPoint> camino)
			throws IllegalArgumentException, IllegalStateException, IOException {
		super();
		this.nombre = nombre;
		this.camino = camino;

		construccionGPX();
	}
	
	//Constructor para crear un fichero ruta partiendo de una ruta incluida en un String
	public CreacionRutaGPX(String fichero, String nombre) throws IOException{
		File f = null;
		try {
			File ruta_sd = Environment.getExternalStorageDirectory();

			f = new File(ruta_sd.getAbsolutePath(), nombre + ".gpx");
		} catch (Exception ex) {
			Log.e("Ficheros", "Error al crear fichero en tarjeta SD");
		}
		out = new OutputStreamWriter(new FileOutputStream(f));
		out.write(fichero);
		out.close();
	
		
	}

	private void construccionGPX() throws IllegalArgumentException,
			IllegalStateException, IOException {

		// Creamos el serializer
		ser = Xml.newSerializer();

		// Creamos fichero en sd

		File ruta_sd = Environment.getExternalStorageDirectory();

		f = new File(ruta_sd.getAbsolutePath(), nombre + ".gpx");

		fout = new OutputStreamWriter(
				new FileOutputStream(f));

		// Asignamos el resultado del serializer al fichero
		ser.setOutput(fout);

		// Construimos el XML

		ser.startTag("", "gpx");
		ser.attribute("", "creator", "LinuxPhone");
		ser.attribute("xsi", "xmlns",
				"http://www.w3.org/2001/XMLSchema-instance");
		ser.attribute("", "xmlns", "http://www.topografix.com/GPX/1/0");
		ser.startTag("", "trk");
		ser.startTag("", "name");
		ser.text(nombre);
		ser.endTag("", "name");
		ser.startTag("", "desc");
		ser.endTag("", "desc");
		ser.startTag("", "trkseg");
		for (Entry<Long, GeoPoint> punto : camino.entrySet()) {
			ser.startTag("", "trkpt");
			float latitud = (punto.getValue().getLatitudeE6())
					/ (float) Math.pow(10.0, 6.0);
			float longitud = (punto.getValue().getLongitudeE6())
					/ (float) Math.pow(10.0, 6.0);
			ser.attribute("", "lat", Float.toString(latitud));
			ser.attribute("", "lon", Float.toString(longitud));
			ser.startTag("", "ele");
			ser.text(Integer.toString(punto.getValue().getAltitude()));
			ser.endTag("", "ele");
			ser.startTag("", "time");
			ser.text(Long.toString(punto.getKey()));
			ser.endTag("", "time");
			ser.endTag("", "trkpt");

		}
		ser.endTag("", "trkseg");
		ser.endTag("", "trk");
		ser.endTag("", "gpx");
		ser.endDocument();
		fout.close();

		//Guardamos el fichero en el servidor
		new ClaseComunicacion().execute("");

	}

	private class ClaseComunicacion extends AsyncTask<String, Void, String> {

		@Override
		protected String doInBackground(String... arg0) {
			String xmlString = archivoAString();
			String nombreArchivo = nombre.toString();
			nombreArchivo= nombreArchivo + ".gpx";
			FuncionesJSON userFunction = new FuncionesJSON();
			JSONObject json = userFunction
					.guardarRuta(nombreArchivo, xmlString);
			try {
				if (json.getString(KEY_SUCCESS) != null) {
					String res = json.getString(KEY_SUCCESS);
					if (Integer.parseInt(res) != 1) {
						Log.v("JSON", "FALLO al guardar archivo ruta");
					}
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}
			return null;
		}
	}
	
	//Pasamos el archivo a string para enviarlo utilizando Json
	private String archivoAString() {
		String result = "";
		try {
			byte[] buffer = new byte[(int) f.length()];
			in = new DataInputStream(new FileInputStream(f));
			in.readFully(buffer);
			result = new String(buffer);
		} catch (IOException e) {
		} finally {
			try {
				in.close();
			} catch (IOException e) {
			}

		}

		return result;
	}
}
